<?php
defined('IN_CMS') or die('Direct access to Script restricted.');

class Common
{
	protected static $cfg;
	protected static $obj_db;
	protected static $obj_mailer;
	protected static $obj_functions;
	protected static $obj_error;
	protected static $obj_session;
	protected static $obj_request;
	protected static $obj_geo;
	protected static $obj_user;
	protected static $obj_profile;
	protected static $obj_page;
	protected static $obj_template;
	
	/**
	 * 
	 */
	public static function main()
	{
		$start = self::microtime();

		// Массив с данными о конфигурации сайта (определен в "config.php")
		global $cfg;
		self::$cfg = $cfg;

		// Подключение к базе данных
		self::initDB();
		
		// Отправка email
		self::initMailer();

		// Функции
		self::initFunctions();

		// Обработка ошибок
		self::initError();
		
		// Session
		self::initSession();

		// Строка запроса
		self::initRequest();
		
		// Страны, районы, города, ...
		self::initGeo();

		// Посетители
		self::initUser();
		
		// Профили
		self::initProfile();

		// Страницы сайта
		self::initPage();

		// Шаблоны
		self::initTemplate();

		//-----------------------------------------------------
		// Установим контент страницы
		self::$obj_page->setPageContent();
		self::$obj_page->setPageMeta();

		// Парсим контент страницы
		self::$obj_template->parse('main.tpl_page_content');

		self::$obj_template->parse('main');
		self::$obj_template->out('main');

		$end = self::microtime();
		//-----------------------------------------------------

		// Информация для отладки скриптов
		if (DEBUG == '1')
		{
			self::$obj_error->showMessage('<hr />', 3);
			self::$obj_error->showMessage('<u>Время выполнения:</u> ' . ($end - $start) . ' сек.', 3);
			self::$obj_error->showMessage('<u>Используется памяти:</u> ' . floor(memory_get_usage()/1024) . ' Kb / ' . floor(memory_get_peak_usage()/1024) . ' Kb', 3);
			self::$obj_error->showMessage('<u>Количество запросов к БД:</u> ' . self::$obj_db->num_queries(), 3);
			foreach (self::$obj_db->get_queries() as $key => $value)
			{
				self::$obj_error->showMessage('<u>Запрос #' . $key . '</u>: <br />' . $value, 3);
			}
		}
	}

	/**
	 * 
	 */
	private static function initDB()
	{
		require_once ABSPATH . 'includes/classes/class.mysql.php';
		self::$obj_db = new sql_db(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, true);
	}
	
	/**
	 *
	 */
	private static function initMailer()
	{
		require_once ABSPATH . 'includes/classes/class.mailer.php';
		self::$obj_mailer = new Mailer();
	}

	/**
	 *
	 */
	private static function initFunctions()
	{
		require_once ABSPATH . 'includes/classes/class.functions.php';
		self::$obj_functions = new Functions();
	}

	/**
	 *
	 */
	private static function initError()
	{
		require_once ABSPATH . 'includes/classes/class.error.php';
		self::$obj_error = new Error();
	}
	
	/**
	 * 
	 */
	private static function initSession()
	{
		require_once ABSPATH . 'includes/classes/class.session.php';
		self::$obj_session = new Session();
		
		session_set_save_handler(	array(self::$obj_session, "open"), 
									array(self::$obj_session, "close"), 
									array(self::$obj_session, "read"), 
									array(self::$obj_session, "write"), 
									array(self::$obj_session, "destroy"), 
									array(self::$obj_session, "gc") 
								);
		
		session_start();
	}

	/**
	 *
	 */
	private static function initRequest()
	{
		require_once ABSPATH . 'includes/classes/class.request.php';
		self::$obj_request = new Request();
	}
	
	/**
	 *
	 */
	private static function initGeo()
	{
		require_once ABSPATH . 'includes/classes/class.geo.php';
		self::$obj_geo = new Geo();
	}

	/**
	 *
	 */
	private static function initUser()
	{
		require_once ABSPATH . 'includes/classes/class.user.php';
		self::$obj_user = new User();
	}
	
	/**
	 *
	 */
	private static function initProfile()
	{
		require_once ABSPATH . 'includes/classes/class.profile.php';
		self::$obj_profile = new Profile();
	}

	/**
	 *
	 */
	private static function initPage()
	{
		require_once ABSPATH . 'includes/classes/class.page.php';
		self::$obj_page = new Page();
	}

	/**
	 *
	 */
	private static function initTemplate()
	{
		require_once ABSPATH . 'includes/classes/class.xtemplate.php';

		$tpldir = ABSPATH . 'templates/' . TPL_NAME . '/' . LANG . '/';

		// Шаблон
		self::$obj_template = new XTemplate(TPL_MASTER_PAGE, $tpldir);

		// Путь к корню сайта
		self::$obj_template->assign('SITE_ROOT', SITE_ROOT);

		// Язык сайта
		self::$obj_template->assign('LANG', LANG);

		// Абсолютный путь к директории сайта
		self::$obj_template->assign('ABSPATH', ABSPATH);
		
		// URL текущей страницы (только параметры, без учета имени домена и языка)
		self::$obj_template->assign('REQUEST_URL', self::$obj_request->getRequestURL());

		// Путь к папке с шаблоном сайта
		define('TPL_PATH', SITE_ROOT . 'templates/' . TPL_NAME . '/' . LANG . '/');
		self::$obj_template->assign('TPL_PATH', TPL_PATH);
	}

	/**
	 * Возвращает текущее время в секундах в виде
	 * действительного числа с долями секунды
	 *
	 * @return	double
	 */
	private static function microtime()
	{
		$t = explode(" ", microtime());
		return $t[0] + $t[1];
	}

}
?>